package org.logan.sample.web.base.shiro;

import java.io.Serializable;

import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.logan.sample.base.cache.redis.RedisCacheManager;
import org.logan.sample.base.cache.redis.RedisCacheWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/** 如果自定义 CacheManager 可直接使用EnterpriseCacheSessionDAO
 * @Desc：
 * 
 * @Title：RedisEPCacheSessionDAO
 * @author: Logan
 * @version: 1.0
 * @date: 2016年11月28日 下午12:33:50
 */
@Deprecated
public class RedisEPCacheSessionDAO extends EnterpriseCacheSessionDAO {
	private static final Logger logger = LoggerFactory.getLogger(RedisEPCacheSessionDAO.class);

	private RedisCacheWrapper sessionRCW = null;
	private String keyPrefix = "rjsession";

	// 创建session，保存到数据库
	@Override
	protected Serializable doCreate(Session session) {
		Serializable sessionId = super.doCreate(session);
		if (null == sessionRCW) {
			try {
				RedisCacheManager.createCache(keyPrefix,1);
			} catch (Exception e) {
				logger.error("创建缓存异常：", e);
			}
			sessionRCW = RedisCacheManager.getRedisCacheWrapperByName(keyPrefix);
		}
		sessionRCW.setObject(sessionId.toString(), session);
		logger.debug("创建session:" + sessionId);
		return sessionId;
	}

	// 获取session
	@Override
	protected Session doReadSession(Serializable sessionId) {
		// 先从缓存中获取session，如果没有再去数据库中获取
		Session session = super.doReadSession(sessionId);
		if (null == session) {
			session = (Session) sessionRCW.getObject(sessionId.toString());
		}
		logger.debug("获取session:" + sessionId);
		return session;
	}

	// 更新session的最后一次访问时间
	@Override
	protected void doUpdate(Session session) {
		super.doUpdate(session);
		String sid = session.getId().toString();
		sessionRCW.setObject(sid, session);
		if (logger.isDebugEnabled())
			logger.debug("更改session:" + sid);
	}

	// 删除session
	@Override
	protected void doDelete(Session session) {
		super.doDelete(session);
		sessionRCW.removeObject(session.getId().toString());
		if (logger.isDebugEnabled())
			logger.debug("更改session:" + session.getId().toString());
	}

}
